package org.code.boot.service.boot.impl;

import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import cn.hutool.core.collection.CollUtil;
import java.util.stream.Collectors;
import org.code.boot.common.exception.ServiceException;
import org.code.boot.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.code.boot.mapper.boot.BizOrderHistoryMapper;
import org.code.boot.domain.boot.BizOrderHistory;
import org.code.boot.service.boot.IBizOrderHistoryService;

/**
 * 订单历史记录Service业务层处理
 * 
 * @author coder
 * @date 2025-08-28
 */
@Service
public class BizOrderHistoryServiceImpl implements IBizOrderHistoryService 
{
    @Autowired
    private BizOrderHistoryMapper bizOrderHistoryMapper;


    /**
     * 查询订单历史记录
     * 
     * @param historyId 订单历史记录主键
     * @return 订单历史记录
     */
    @Override
    public BizOrderHistory selectBizOrderHistoryByHistoryId(Long historyId)
    {
        return bizOrderHistoryMapper.selectBizOrderHistoryByHistoryId(historyId);
    }

    /**
     * 查询订单历史记录列表
     * 
     * @param bizOrderHistory 订单历史记录
     * @return 订单历史记录
     */
    @Override
    public List<BizOrderHistory> selectBizOrderHistoryList(BizOrderHistory bizOrderHistory)
    {
        return bizOrderHistoryMapper.selectBizOrderHistoryList(bizOrderHistory);
    }

    /**
     * 新增订单历史记录
     * 
     * @param bizOrderHistory 订单历史记录
     * @return 结果
     */
    @Override
    public int insertBizOrderHistory(BizOrderHistory bizOrderHistory)
    {
        bizOrderHistory.setCreateTime(DateUtils.getNowDate());
        return bizOrderHistoryMapper.insertBizOrderHistory(bizOrderHistory);
    }

    /**
     * 修改订单历史记录
     * 
     * @param bizOrderHistory 订单历史记录
     * @return 结果
     */
    @Override
    public int updateBizOrderHistory(BizOrderHistory bizOrderHistory)
    {
        bizOrderHistory.setUpdateTime(DateUtils.getNowDate());
        return bizOrderHistoryMapper.updateBizOrderHistory(bizOrderHistory);
    }

    /**
     * 批量删除订单历史记录
     * 
     * @param historyIds 需要删除的订单历史记录主键
     * @return 结果
     */
    @Override
    public int deleteBizOrderHistoryByHistoryIds(Long[] historyIds)
    {
        // 检查数据表是否被其他表引用
        List<Long> idList = Arrays.asList(historyIds);
        if (isDataTableReferenced(idList))
        {
            throw new ServiceException("该订单历史记录中有数据正在被其他表引用，无法删除");
        }
        return bizOrderHistoryMapper.deleteBizOrderHistoryByHistoryIds(historyIds);
    }

    /**
     * 删除订单历史记录信息
     * 
     * @param historyId 订单历史记录主键
     * @return 结果
     */
    @Override
    public int deleteBizOrderHistoryByHistoryId(Long historyId)
    {
        // 检查数据表是否被其他表引用
        List<Long> idList = Arrays.asList(historyId);
        if (isDataTableReferenced(idList))
        {
            throw new ServiceException("该订单历史记录正在被其他数据引用，无法删除");
        }
        return bizOrderHistoryMapper.deleteBizOrderHistoryByHistoryId(historyId);
    }
    /**
     * 获得订单历史记录列表
     *
     * @param ids 订单历史记录编号数组
     * @return 订单历史记录列表
     */
    @Override
    public List<BizOrderHistory> getBizOrderHistoryList(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new ArrayList<>();
        }
        return bizOrderHistoryMapper.selectBizOrderHistoryListByIds(ids);
    }

    /**
     * 根据用户ID列表统计订单历史记录数量
     *
     * @param userIds 用户ID数组
     * @return 订单历史记录数量
     */
    @Override
    public Long countByUserIds(Collection<Long> userIds) {
        if (CollUtil.isEmpty(userIds)) {
            return 0L;
        }
        return bizOrderHistoryMapper.countByUserIds(userIds);
    }

    /**
     * 根据关联订单ID列表统计订单历史记录数量
     *
     * @param orderIds 关联订单ID数组
     * @return 订单历史记录数量
     */
    @Override
    public Long countByOrderIds(Collection<Long> orderIds) {
        if (CollUtil.isEmpty(orderIds)) {
            return 0L;
        }
        return bizOrderHistoryMapper.countByOrderIds(orderIds);
    }

    
    /**
     * 检查数据表是否被其他表引用
     * 
     * @param ids 订单历史记录主键列表
     * @return 是否被引用
     */
    private boolean isDataTableReferenced(List<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return false;
        }
        
        // 当前数据表没有被其他表引用，可以安全删除
        return false;
    }
}
